package com.ideaaedi.log4j2.defender.defender;

import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;

/**
 * 脱敏器
 *
 * @author JustryDeng
 * @since 2021/7/20 23:21:45
 */
public interface Log4j2MessageDefender {
    
    /**
     * 是否支持脱敏
     * <ul>
     *     <li>若是编写脱敏器，那么此方法可直接返回true</li>
     *           <li>若是编写插件，那么可通过控制此方法的返回值，来控制插件作用范围</li>
     * </ul>
     *
     * @param event
     *         日志事件<br/> 你可能需要用到：
     *         <ul>
     *             <li>
     *                 获取日志上下文 - {@link LogEvent#getContextData()} <br/>
     *                 你可以通过操作{@link ThreadContext#put(String, String)}，在编写你的项目时，往日志上下文中存放必要的信息
     *             </li>
     *             <li>
     *                 获取Message对象 - {@link LogEvent#getMessage()} <br/>
     *                 你可以通过调用{@link Message#getFormattedMessage()}获取解析后的完整的日志内容<br/>
     *                 你可以通过调用{@link Message#getFormat()}未被解析时的日志内容<br/>
     *                 你可以通过调用{@link Message#getParameters()} ()}获取日志参数<br/>
     *             </li>
     *             <li>获取loggerName(一般为logger所属类的全类名) - {@link LogEvent#getLoggerName()}</li>
     *             <li>......</li>
     *         </ul>
     *
     * @return 是否支持脱敏
     */
    boolean support(final LogEvent event);
    
    /**
     * 脱敏
     *
     * @param event
     *         日志信息对象<br>
     *         这里面有很多信息，你可能并不都关注；对于常用的对象Message，已经从此对象{@link LogEvent#getMessage()}出来作为此方法的第二个参数
     * @param message
     *         日志信息对象
     * @param buffer
     *         日志信息容器，用于存放最终的日志
     */
    void desensitize(final LogEvent event, final Message message, final StringBuilder buffer);
}
